通道队列 ""
这是《代码的未来》中的一个例子。
package main
import "fmt"
const ngoroutine = 10000
func f(left, right chan int) {
left <- 1 + <-right
}
func main() {
leftmost := make(chan int)
var left, right chan int = nil, leftmost
for i := 0; i < ngoroutine; i++ {
left, right = right, make(chan int)
go f(left, right)
}
right <- 0
fmt.Println(<-leftmost)
}
说来惭愧,第一眼竟没有看出这个程序的逻辑所在。
经过好长时间的仔细阅读才发现,这个其实是一个累加过程。因为前面的channel一直是堵塞的,当main()中把 0 传递给 最后一个 right时,f()中left<-1+<-right
将后一个channel中的值传给前一个,依次向前一个channel中传,最后传到leftmost中,所以最后输出的是 1000
这个程序有点像队列,也有点像堆栈,挺有意思的一段小代码,所以就记录下来了。
blog comments powered by Disqus